#ifndef HAVE_TEXT2XML_PARSER_H
#define HAVE_TEXT2XML_PARSER_H

#include <glib.h>
#include "parser/Lexer.h"

#ifdef __cplusplus
extern "C" {
#endif

#define TEXT2XML_PARSER_MAX_STACK 50

enum TEXT2XML_STATUS {
    TEXT2XML_STATUS_IDLE,
    TEXT2XML_STATUS_RUNNING,
    TEXT2XML_STATUS_LEVEL_OUT,
    TEXT2XML_STATUS_STOPPED,
    TEXT2XML_STATUS_FAILED
};

enum TEXT2XML_STREAM_OBJECT {
    T_OPEN,
    T_CLOSE,
    T_SINGLE,
    T_DATA,
    T_DATA_APPEND
};

typedef struct _Parser Parser;

typedef void (*ParserCallbackFunc)(Parser*, int, const char*, void*);

struct _Parser {
  Lexer*             lexer;
  GList*             xml_stack;
  int                status;
  char               error[101];
  ParserCallbackFunc callback;
  void*              callback_data;
  Vector*            match_stack[TEXT2XML_PARSER_MAX_STACK];
  int                stack_depth;
  GList*             xml_queue;
  GList*             xml_queue2;
  GList*             re_list;
  GList*             re_garbage;
};

Parser* parser_new(void);

void parser_free(Parser* parser);

int parser_run(Parser*            parser,
               const char*        string,
               ParserCallbackFunc callback,
               void*              callback_data);

const char* parser_error(Parser* parser);

float parser_get_progress(Parser* parser);

void parser_stop(Parser* parser);

#ifdef __cplusplus
}
#endif                          /* __cplusplus */
#endif                          /* HAVE_TEXT2XML_PARSER_H */
